from django.shortcuts import render
from django.views import View
from django.http import HttpResponse,JsonResponse
from django_redis import get_redis_connection

import re,random
from verifications.libs.captcha.captcha import captcha
from verifications.libs.yuntongxun.ccp_sms import CCP
from celery_tasks.sms.tasks import ccp_send_sms_code

import logging
# Create your views here.



# 图形验证码接口
class ImageCodeView(View):

    def get(self, request, uuid):
        # 1.提取参数
        # 2.校验参数


        # redis_conn = get_redis_connection("verify_code")
        # # img_%s -- image_code_id
        # result = redis_conn.get("image")
        # return HttpResponse(str(result))


        # 3.业务数据处理－－使用captcha生成图片验证码，写入redis，响应图片数据
        # 调用captcha生成图片和验证码
        text, image = captcha.generate_captcha()
        print("验证码：", text)
        # 把验证码写入redis
        # 约定格式：{img_<uuid>: text}
        # get_redis_connection：根据django的配置获取一个redis的连接对象
        redis_conn = get_redis_connection("verify_code")

        redis_conn.setex("img_%s" % uuid, 300, text)
        # 4.构建响应：图片数据，作为响应体数据
        return HttpResponse(image, content_type="image/jpeg")



# 短信验证码接口
class SMSCodeView(View):

    def get(self, request, mobile):

        # 提取参数
        image_code = request.GET.get("image_code")
        image_code_id = request.GET.get("image_code_id")
        # print(image_code, image_code_id)


        # redis_conn = get_redis_connection("verify_code")
        # # img_%s -- image_code_id
        # result = redis_conn.get("image")
        # return HttpResponse(str(result))

        # 校验参数
        # 必要校验
        if not all([image_code, image_code_id]):
            return JsonResponse({"code": 400, "errmsg": "缺少必要参数"}, status=400)
        # 约束校验
        #
        if not re.match(r'^[a-zA-Z0-9]{4}$', image_code):
            return JsonResponse({"code": 400, "errmsg": "图形验证码格式有误"}, status=400)
        # uuid是前端发来，标记每一张图片的。
        if not re.match(r'^[0-9a-f]{8}(-[0-9a-f]{4}){3}-[0-9a-f]{12}$', image_code_id):
            return JsonResponse({"code": 400, "errmsg": "uuid格式错误"}, status=400)
        # 业务校验
        # 创建连接到redis的对象
        redis_conn = get_redis_connection("verify_code")
        # 提取图形验证码
        image_code_from_redis = redis_conn.get("img_%s" % image_code_id)
        # 删除图形验证码，避免恶意测试图形验证码
        try:
            redis_conn.delete('img_%s' % image_code_id)
        except Exception as e:
            logging.error(e)

        # 图形验证码过期或者不存在
        if not image_code_from_redis:
            return JsonResponse({"code": 400, "errmsg": "图形验证码失效"}, status=400)
        # 对比图形验证码
        if image_code.lower() != image_code_from_redis.decode().lower():
            return JsonResponse({"code": 400, "errmsg": "图形验证码错误"}, status=400)
        #TODO:判断数据库里面的标志信息是否存在

        # 根据key在数据库中取出短信验证码
        sms_code_from_redis = redis_conn.get('send_flag_%s' % mobile)
        # 如果对象不为空，证明该号码已经有验证码了
        if sms_code_from_redis:
            return JsonResponse({"code": 400, "errmsg": "发送短信过于频繁"}, status=400)

        # 业务数据处理
        # 随机数0-999999
        sms_code = "%06d" % random.randrange(0, 999999)
        # TODO:使用yuntongxun发短信
        # # 发送短信的对象
        # ccp = CCP()
        # # (2)、发送短信
        # ccp.send_template_sms(
        #     mobile,
        #     [sms_code, 5],
        #     1
        # )
        # TODO:采用异步来发短信，发布任务
        ccp_send_sms_code.delay(mobile, sms_code)

        print("短信验证码：", sms_code)
        # TODO: 把短信验证码存入redis --> sms_手机号 ：sms_code
        # TODO:优化，使用redis的pipeline功能，把多条redis命令批量执行
        # 创建redis管道
        p1 = redis_conn.pipeline()
        # 将redis请求添加到队列
        # redis_conn.setex('sms_%s' % mobile, 300, sms_code)
        p1.setex('sms_%s' % mobile, 300, sms_code)
        # TODO:添加标志信息，记录６０秒之内发送过短信
        # redis_conn.setex('send_flag_%s' % mobile, 60, 1)
        p1.setex('send_flag_%s' % mobile, 60, 1)
        p1.execute()

        # 4、构建响应
        return JsonResponse({'code': 0, 'errmsg': 'ok'})




